package br.eng.eliseu.gwt.gestaoWeb.client.util;

import java.util.Date;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.regexp.shared.MatchResult;
import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.user.datepicker.client.DateBox.DefaultFormat;

public class DateUtilClient {
	
	public static final String DEFAULT_DATE_FMT_PATTERN = "dd/MM/yyyy";
	public static final String DEFAULT_TIME_FMT_PATTERN = "HH:mm:ss";
	public static final String DEFAULT_TIME_FMT_PATTERN_SMALL = "HH:mm";
	public static final String DEFAULT_DATETIME_FMT_PATTERN = "dd/MM/yyyy HH:mm:ss";
	public static final String DEFAULT_YEAR_FMT_PATTERN = "yyyy";
	public static final String DEFAULT_MONTH_FMT_PATTERN = "MM";
	public static final String DEFAULT_DAY_FMT_PATTERN = "dd";
	public static final String DEFAULT_FULL_DATE = "dd' de 'MMMM' de 'yyyy";
	private static final String DATE_SEPARATOR = "/";
	
	/**
	 * Retorna o formato padrao de datas dd/MM/yyyy
	 */
	public static DefaultFormat getDateFormat(){
		final DateTimeFormat format = DateTimeFormat.getFormat(DEFAULT_DATE_FMT_PATTERN);
		return new DefaultFormat(format);
	}
	
	/**
	 * Formata com o pattern padrão definido em DEFAULT_DATE_FMT_PATTERN: "dd/MM/yyyy"
	 * @param data
	 * @return string formatada
	 */
	public static String parseToString(Date data) {
		return parseToString(DEFAULT_DATE_FMT_PATTERN, data);
	}
	
	/**
	 * Formata com o pattern padrão definido em DEFAULT_TIME_FMT_PATTERN: "HH:mm:ss" 
	 * @param data
	 * @return string formatada
	 */
	public static String parseTimeToString(Date data) {
		return parseToString(DEFAULT_TIME_FMT_PATTERN, data);
	}

	/**
	 * Formata com o pattern padrão definido em DEFAULT_DATETIME_FMT_PATTERN: "dd/MM/yyyy HH:mm:ss" 
	 * @param data
	 * @return string formatada
	 */
	public static String parseDatetimeToString(Date data) {
		return parseToString(DEFAULT_DATETIME_FMT_PATTERN, data);
	}

	/**
	 * Patterns: <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/index.html?overview-summary.html">referencia</a>
	 * @param pattern as mesmas do {@link DateTimeFormat} por exemplo "dd/MM/yy" 
	 * @param data a data a ser formatada
	 * @return string formatada
	 * @see DateTimeFormat
	 */
	public static String parseToString(String pattern, Date data) {
		if (data != null && pattern!=null && "DEFAULT_FULL_DATE".equals(pattern)){
			return getDataExtenso(data);
		}else if(data != null && pattern!=null && !"".equals(pattern) ) {
			return DateTimeFormat.getFormat(pattern).format(data);
		}
		return "";
	}

	public static Integer getYear(Date data){
		Integer ano = 1900;
		if (data != null){
			ano = Integer.parseInt(parseToString(DEFAULT_YEAR_FMT_PATTERN, data));
		}
		return ano;

	}

	public static Integer getMonth(Date data){
		Integer mes = 1;
		if (data != null){
			mes = Integer.parseInt(parseToString(DEFAULT_MONTH_FMT_PATTERN, data));
		}
		return mes;

	}

	public static Integer getDay(Date data){
		Integer dia = 1;
		if (data != null){
			dia = Integer.parseInt(parseToString(DEFAULT_DAY_FMT_PATTERN, data));
		}
		return dia;

	}

	public static Integer getDiferencaDias(Date inicio, Date fim){
		Long dif = new Long(( fim.getTime() - inicio.getTime() )/ (1000*60*60*24));
		return dif.intValue() + 1;
	}

	public static Date getDate(Integer dd, Integer mm, Integer yyyy) {
		if (dd == null || mm == null || yyyy == null)
			return null;
		Date retVal = null;
		try {
			retVal = DateTimeFormat.getFormat(DEFAULT_DATE_FMT_PATTERN).parse(dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy);
		} catch (Exception e) {
			retVal = null;
		}
		return retVal;
	}

	public static boolean isValidDate(Integer dd, Integer mm, Integer yyyy) {
		boolean isvalidDate = true;
		try {
			String transformedInput = DateTimeFormat.getFormat(DEFAULT_DATE_FMT_PATTERN).format(getDate(dd, mm, yyyy));
			String originalInput = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy;
			isvalidDate = transformedInput.equals(originalInput);
		} catch (Exception e) {
			isvalidDate = false;
		}
		return isvalidDate;
	}



	@SuppressWarnings("deprecation")
	public static String getDataExtenso(Date data){
		String mes[] = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"};
		return data.getDate() + " de " + mes[data.getMonth()] + " de " + data.getYear();
	}

	/**
	 * Verifica se a string passada como parametro esta no formato de Hora ( 99:99 ou HH:MM)<br>
	 * Para isto esta funsao usa expressoes reguralres
	 * @param hora
	 * @return
	 */
	public static boolean isValidHora( String hora ){
		if (hora==null || "".equals(hora)){
			return false;
		}
		
		RegExp regExp = RegExp.compile("^([0-1]\\d|2[0-3]):[0-5]\\d$");
		MatchResult matcher = regExp.exec(hora);

		return (matcher != null); // equivalent to regExp.test(inputStr); 
	}

	

}
